2.1-docker compose
Create by fall on 24 Jul 2023
Recently revised in 24 Jul 2023
docker-compose
如果将配置全在命令行里书写,不容易保存,且一次只能生成一个容器,修改和查找上下文也不方便。
以 docker-compose 来运行命令,可以解决上面的问题。即,通过一个 docker-compose.yml
文件生成多个容器。
不同于命令 docker run <image>
,docker compose 创建的内容,将自动处于同一个网络环境。
官方文档:
命令
运行 docker-compose.yaml
使用 docker-compose up
命令即可运行 docker-compose.yaml
-d
表示在后台运行- 默认会将
compose.yaml
所在的文件夹的名称作为项目名称,将所用到的容器放置在该项目中 -f
可以指定对应的运行
# 查看日志
docker compose logs
关闭 compose
docker compose down
或者直接在可视化界面删除(项目和项目下的容器)。
- 添加
--volumes
连同 volume 一起删除。
compose 命令可以使用
-
或者(空格符号) 进行连接
# 列出所有的容器,以及运行状态和所有端口
docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------
demo_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp
demo_web_1 docker-entrypoint.sh /bin/ ... Up 0.0.0.0:8080->8080/tcp
# 查看某个服务的信息
docker-compose ps [service name]
配置项
顶层配置
- services 定义各个服务的配置,可以指定每个服务的镜像、容器名称、启动命令、端口映射、环境变量等。
- version 指定 Docker Compose 的版本号
- volumes 定义数据卷,必须在顶层进行定义,才能在容器中进行使用。
配置项 | 描述 |
---|---|
networks | 定义各个网络的配置,常见的如 bridge、host、overlay 等 |
volumes | 定义数据卷的配置,指定数据卷的使用方式。 |
build | 指定 Dockerfile 的路径或者一个 URL,用于构建镜像。 |
image | 指定镜像的名称或者 ID,用于拉取或者使用一个已经存在的镜像。 |
ports | 指定容器内部端口和主机端口之间的映射关系。 |
environment | 指定容器的环境变量。 |
depends_on | 指定容器之间的依赖关系,如谁依赖谁,启动顺序等。 |
command | 指定容器启动时要运行的命令。 |
restart | 指定容器在出现故障时应该如何重新启动。常见的配置如,always |
healthcheck | 定义容器的健康检查。 |
deploy | 指定服务在 Docker Swarm 中的部署配置。 |
secrets | 指定容器中使用的加密密钥和证书等。 |
configs | 指定容器中使用的配置文件。 |
working_dir | 工作路径 |
配置对比
docker run -dp 127.0.0.1:3000:3000 \
-w /app -v "$(pwd):/app" \
--network todo-app \
-e MYSQL_HOST=mysql \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=secret \
-e MYSQL_DB=todos \
node:18-alpine \
sh -c "yarn install && yarn run dev"
# docker-compose.yml
services:
app:
image: node:18-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 127.0.0.1:3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
完整配置示例
version: '3'
services:
web:
build: .
networks:
- front
service:
image: node:18-alpine # 镜像名称以及版本
container_name: my-node # 生成的容器名称
restart: always # 重启 docker 后该容器也重启 # unless-stopped 手动停止的容器不会重启,其余情况和 always 一致
command: sh -c "yarn install && yarn run dev" # 覆盖容器启动后默认执行的命令。
ports:
- 127.0.0.1:3000:3000
working_dir: /app
volumes:
- ./app:/app # 将当前目录下的 app 文件夹映射到容器的 /app
- ./.env:/app/.env:ro # 将当前目录下的 env 文件夹映射到容器的 /app,并且是只读的
environment: # 环境变量
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
networks:
- front
- back
mysql:
image: mysql:8.0
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
networks:
- back
# 需要在最顶层定义 volumes 并且在确定的位置进行引用
volumes:
todo-mysql-data:
networks:
front:
driver: bridge
back:
driver: bridge
自动化部署
使用 docker
+ jenkins
能实现代码提交到 github 后自动部署环境
docker login
进行登录docker login -u username
指定用户名称docker push username/image-name
将镜像推送到 docker hub
关联 Dockerfile
使用 build 参数可以指定Dockerfile
所在文件夹的路径,可以是绝对路径,也可以是相对docker-compose.yml文件的路径
version: '3'
services:
web:
build: /path/to/build/dir
version: '3'
services:
web:
build:
context: ./
dockerfile: Dockerfile-alternate
args:
var1: 1
var2: c
应用的使用
参考文章
作者 | 文章名称 |
---|---|
爱笑的架构师 | 5分钟带你快速了解Docker和k8s |
佳庆 | docker-compose讲解与安装 |
官方文档 | https://docs.docker.com/get-started/02_our_app/ |